﻿package com.action;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.bean.Content;
import com.bean.Question;
import com.bean.User;
import com.dao.DaoUtils;

public class UserAction extends BaseAction
{
    private String hello = "hello";

    private List<User> userList;

    private List<Question> questList;

    private User user;

    private Question question;

    private String msg = "";

    private String u_name;

    private String u_password;

    private String new_password;

    private String key = "";

    private int uid;

    private String quest;

    private String questA;

    private String questB;

    private String questC;

    private String questD;

    private String questresult;

    private int q_type;

    private String q_key;

    private int q_id;

    private int page = 1;

    private int pageCount;

    private int pageSize = 20;

    public String hello()
    {
        hello += " world";
        userList = DaoUtils.findList("selectUserList");
        return SUCCESS;
    }

    public String jsp()
    {
        return SUCCESS;
    }

    public String loginJsp()
    {
        getSession().removeAttribute("user");
        return SUCCESS;
    }

    public String userInfoJsp()
    {
        user = (User) getSession().getAttribute("user");
        if (user == null)
        {
            return INPUT;
        }
        // 旧密码是否显示0不显示 1显示2隐藏
        if (user.getU_type() == 1)
        {
            getRequest().setAttribute("oldpasswordShow", 2);
        }
        else
        {
            getRequest().setAttribute("oldpasswordShow", 1);
        }
        getRequest().setAttribute("user", user);
        return SUCCESS;
    }

    
    public String addUser()
    {
        List<User> listUser = null;
        try
        {
            u_name = URLDecoder.decode(u_name, "utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        // 判断该用户名是否存在
        listUser = DaoUtils.findList("selectUserByName", u_name);
        // 不存在就插入
        if (listUser != null && listUser.size() != 0)
        {
            msg = "该用户名已经存在";
        }
        else
        {
            User user = new User();
            user.setU_name(u_name);
            user.setU_password(u_password);
            DaoUtils.add("addUser", user);
            msg = "添加成功";
        }
        outJson(getResponse(), msg);
        return SUCCESS;
    }
    
    public String cross()
    {
        int qid;
        String qresul;
        String qidStr;
        Question quest;
        double grade = 0;
        // 结果计算
        for (int i = 1; i < 11; i++)
        {
            // 先获得多有的题目的id和学生的选择
            qidStr = getValue("quest_" + i + "_id");
            qid = qidStr != null ? Integer.parseInt(qidStr) : 0;
            qresul = getValue("quest_" + i);
            // 到数据库中比对是否正确，并给出该题的得分
            quest = new Question(qid, qresul);

            List<Question> list = DaoUtils.findList("findQuestionByIdKey",
                    quest);
            if (list != null && list.size() != 0)
            {
                int type = list.get(0).getQ_type();
                if (type == 1)
                {
                    grade += 5;
                }
                else if (type == 2)
                {
                    grade += 10;
                }
                else if (type == 3)
                {
                    grade += 15;
                }
            }
        }
        // 得到总分数更新数据库
        User user = ((User) getSession().getAttribute("user"));
        if (user == null)
        {
            user = new User();
            user.setU_id(Integer.parseInt(getRequest().getParameter("u_id")));
        }
        user.setU_grade(grade);
        DaoUtils.update("updateGrade", user);
        getSession().setAttribute("user", user);

        // 旧密码是否显示0不显示 1显示
        getRequest().setAttribute("oldpasswordShow", 1);
        getRequest().setAttribute("user", user);

        return SUCCESS;
    }

    public String startExam()
    {
        User user = (User) getSession().getAttribute("user");
        if (user == null)
        {
            msg = "请重新登录";
            return INPUT;
        }
        if (user.getU_grade() != -1)
        {
            msg = "已经考试过";
            return INPUT;
        }
        List<Question> questList1 = null;
        List<Question> questList2 = null;
        List<Question> questList3 = null;
        // 考试随机题生成(3个1 、4个2、3个3)
        // 简单
        questList1 = DaoUtils.findList("simplenessQuest");
        if (questList1 == null || questList1.size() != 3)
        {
            msg = "服务器内部错误！";
            return INPUT;
        }
        // 一般
        questList2 = DaoUtils.findList("commonlyQuest");
        if (questList2 == null || questList2.size() != 4)
        {
            msg = "服务器内部错误！";
            return INPUT;
        }
        // 困难
        questList3 = DaoUtils.findList("difficultyQuest");
        if (questList3 == null || questList3.size() != 3)
        {
            msg = "服务器内部错误！";
            return INPUT;
        }
        // 合并所有list
        questList = new ArrayList<Question>();
        for (int i = 0; i < 3; i++)
        {
            questList.add(questList1.get(i));
            questList.add(questList2.get(i));
            questList.add(questList3.get(i));
        }
        questList.add(questList2.get(3));

        return SUCCESS;
    }

    public String questInfo()
    {
        Object obj = DaoUtils.findOne("findQuestByQid", q_id);
        if (obj != null)
        {
            question = (Question) obj;
        }
        return SUCCESS;
    }

    public String updateQuest()
    {

        return SUCCESS;
    }

    public String deleteQuest()
    {
        DaoUtils.delete("deleteQuest", q_id);
        manageQuest();
        return SUCCESS;
    }

    public String manageQuest()
    {
        // 添加分页元素
        int pagestart = 0;
       
        if (!"".equals(key.trim()))
        {
            try
            {
                getRequest()
                        .setAttribute("keycode", key.replaceAll("%", "%25"));
                key = URLDecoder.decode(key, "utf-8");
                getRequest().setAttribute("keyresulQuest", key);
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            key = "%" + key.trim() + "%";
        }
        else
        {
            key = "%%";
        }
        if (pageCount == 0)
        {
            pageCount = DaoUtils.findList("findListCount", key).size();
            pageCount = (pageCount + pageSize - 1) / pageSize;
        }
        if (page != 0)
        {
            pagestart = (page - 1) * pageSize;
        }
        else
        {
            pagestart = 0;
        }
        if(pageCount == 0)
        {
            pageCount = 1;
        }
        Content content = new Content();
        content.setKey(key);
        content.setPageStart(pagestart);
        getRequest().setAttribute("pageCount", pageCount);
        getRequest().setAttribute("page", page);
        getRequest().setAttribute("type", "manageQuest");
        questList = DaoUtils.findList("findListQuestion", content);
        return SUCCESS;
    }

    public String manageUserInfo()
    {
        if (!"".equals(key.trim()))
        {
            try
            {
                getRequest()
                        .setAttribute("keycode", key.replaceAll("%", "%25"));
                key = URLDecoder.decode(key, "utf-8");
                getRequest().setAttribute("keyresulUser", key);
            }
            catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
            key = "%" + key.trim() + "%";
        }
        else
        {
            key = "%%";
        }
        int pagestart = 0;
        
        if (pageCount == 0)
        {
            pageCount = DaoUtils.findList("findUserInfoListCount", key).size();
            pageCount = (pageCount + pageSize - 1) / pageSize;
        }
        if (page != 0)
        {
            pagestart = (page - 1) * pageSize;
        }
        else
        {
            pagestart = 0;
        }

        Content content = new Content();
        content.setKey(key);
        content.setPageStart(pagestart);

        userList = DaoUtils.findList("manageUserInfo", content);

        getRequest().setAttribute("pageCount", pageCount);
        getRequest().setAttribute("page", page);
        getRequest().setAttribute("type", "manageUserInfo");
        return SUCCESS;
    }

    public String saveQuest()
    {
        // 先查询是否存在，存在就更新
        List objList = DaoUtils.findList("findQuestByQid", q_id);
        Question q = new Question(quest, questA, questB, questC, questD,
                q_type, q_key);
        if (objList == null || objList.size() == 0)
        {
            // 不存在就插入
            DaoUtils.add("saveQuest", q);
        }
        else
        {
            q.setQ_id(q_id);
            q.setQ_key(q_key);
            DaoUtils.update("updateQuestion", q);
        }
        manageQuest();
        return SUCCESS;
    }

    public String deleteUinfo()
    {
        DaoUtils.delete("deleteUinfo", uid);
        
        manageUserInfo();
        
        return SUCCESS;
    }

    public String updateUserInfo()
    {
        Object obj = DaoUtils.findOne("findUserByUid", uid);
        if (obj != null)
        {
            user = (User) obj;
            user.setU_id(uid);
            // 旧密码是否显示0不显示 1显示 2隐藏
            getRequest().setAttribute("oldpasswordShow", 2);
            getRequest().setAttribute("user", user);
            return SUCCESS;
        }
        else
        {
            msg = "错误";
            return INPUT;
        }
    }

    public String login()
    {
        try
        {
            u_name = URLDecoder.decode(u_name, "utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        User userLogin = new User();
        userLogin.setU_name(u_name);
        userLogin.setU_password(u_password);
        // 查询用户是否存在
        userList = DaoUtils.findList("selectUserByUser", userLogin);
        if (userList != null && userList.size() != 0)
        {
            user = userList.get(0);
            getSession().setAttribute("user", user);

            getRequest().setAttribute("user", user);
            // 旧密码是否显示0不显示 1显示 2隐藏
            if (user.getU_type() == 1)
            {
                getRequest().setAttribute("oldpasswordShow", 2);
            }
            else
            {
                getRequest().setAttribute("oldpasswordShow", 1);
            }
            getRequest().setAttribute("user", user);
        }
        else
        {
            // 不存在跳转msg
            msg = "用户名或密码错误";
            return INPUT;
        }
        return SUCCESS;
    }

    public String logout()
    {
        getSession().removeAttribute("user");
        return SUCCESS;
    }

    public String userInfo()
    {
        user = super.getUser();
        if (user != null)
        {
            // 旧密码是否显示0不显示 1显示
            getRequest().setAttribute("oldpasswordShow", 1);
            getRequest().setAttribute("user", user);
            return SUCCESS;
        }
        else
        {
            msg = "请登录";
            return INPUT;
        }
    }

    public String regedit()
    {
        List<User> listUser = null;
        try
        {
            u_name = URLDecoder.decode(u_name, "utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        // 判断该用户名是否存在
        listUser = DaoUtils.findList("selectUserByName", u_name);
        // 不存在就插入
        if (listUser != null && listUser.size() != 0)
        {
            msg = "该用户名已经存在";
            return INPUT;
        }
        else
        {
            User user = new User();
            user.setU_name(u_name);
            user.setU_password(u_password);
            DaoUtils.add("addUser", user);
            msg = "注册成功";
            userList = DaoUtils.findList("selectUserByUser", user);
            if (userList != null && userList.size() != 0)
            {
                user = userList.get(0);
                getSession().setAttribute("user", user);
            }
        }
        return SUCCESS;
    }

    public String oldpassword()
    {
        try
        {
            u_name = URLDecoder.decode(u_name, "utf-8");
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        // 修改密码
        User newUser = new User();
        newUser.setU_name(u_name);
        newUser.setU_password(u_password);
        Object obj = DaoUtils.findOne("findUserByNamePassword", newUser);
        if (obj == null)
        {
            // 旧密码错误
            outJson(getResponse(), "旧密码错误");
        }
        else
        {
            user = (User) obj;
            newUser.setU_id(user.getU_id());
            // 修改密码
            newUser.setU_password(new_password);
            if (DaoUtils.update("updateUser", newUser))
            {
                // 修改成功
                user = newUser;
                outJson(getResponse(), "修改成功,"+user.getU_password());
            }
            else
            {
                // 修改失败
                outJson(getResponse(), "修改失败,"+u_password);
            }
        }
        return null;
    }

    /**
     * 取得hello
     * @return 返回 hello。
    
     */
    public String getHello()
    {
        return hello;
    }

    /**
     * 设置hello
     * @param hello 要设置的 hello。
    
     */
    public void setHello(String hello)
    {
        this.hello = hello;
    }

    /**
     * 取得userList
     * @return 返回 userList。
    
     */
    public List<User> getUserList()
    {
        return userList;
    }

    /**
     * 设置userList
     * @param userList 要设置的 userList。
    
     */
    public void setUserList(List<User> userList)
    {
        this.userList = userList;
    }

    /**
     * 取得questList
     * @return 返回 questList。
    
     */
    public List<Question> getQuestList()
    {
        return questList;
    }

    /**
     * 设置questList
     * @param questList 要设置的 questList。
    
     */
    public void setQuestList(List<Question> questList)
    {
        this.questList = questList;
    }

    /**
     * 取得user
     * @return 返回 user。
    
     */
    public User getUser()
    {
        return user;
    }

    /**
     * 设置user
     * @param user 要设置的 user。
    
     */
    public void setUser(User user)
    {
        this.user = user;
    }

    /**
     * 取得question
     * @return 返回 question。
    
     */
    public Question getQuestion()
    {
        return question;
    }

    /**
     * 设置question
     * @param question 要设置的 question。
    
     */
    public void setQuestion(Question question)
    {
        this.question = question;
    }

    /**
     * 取得msg
     * @return 返回 msg。
    
     */
    public String getMsg()
    {
        return msg;
    }

    /**
     * 设置msg
     * @param msg 要设置的 msg。
    
     */
    public void setMsg(String msg)
    {
        this.msg = msg;
    }

    /**
     * 取得u_name
     * @return 返回 u_name。
    
     */
    public String getU_name()
    {
        return u_name;
    }

    /**
     * 设置u_name
     * @param uName 要设置的 u_name。
    
     */
    public void setU_name(String uName)
    {
        u_name = uName;
    }

    /**
     * 取得u_password
     * @return 返回 u_password。
    
     */
    public String getU_password()
    {
        return u_password;
    }

    /**
     * 设置u_password
     * @param uPassword 要设置的 u_password。
    
     */
    public void setU_password(String uPassword)
    {
        u_password = uPassword;
    }

    /**
     * 取得new_password
     * @return 返回 new_password。
    
     */
    public String getNew_password()
    {
        return new_password;
    }

    /**
     * 设置new_password
     * @param newPassword 要设置的 new_password。
    
     */
    public void setNew_password(String newPassword)
    {
        new_password = newPassword;
    }

    /**
     * 取得key
     * @return 返回 key。
    
     */
    public String getKey()
    {
        return key;
    }

    /**
     * 设置key
     * @param key 要设置的 key。
    
     */
    public void setKey(String key)
    {
        this.key = key;
    }

    /**
     * 取得uid
     * @return 返回 uid。
    
     */
    public int getUid()
    {
        return uid;
    }

    /**
     * 设置uid
     * @param uid 要设置的 uid。
    
     */
    public void setUid(int uid)
    {
        this.uid = uid;
    }

    /**
     * 取得quest
     * @return 返回 quest。
    
     */
    public String getQuest()
    {
        return quest;
    }

    /**
     * 设置quest
     * @param quest 要设置的 quest。
    
     */
    public void setQuest(String quest)
    {
        this.quest = quest;
    }

    /**
     * 取得questA
     * @return 返回 questA。
    
     */
    public String getQuestA()
    {
        return questA;
    }

    /**
     * 设置questA
     * @param questA 要设置的 questA。
    
     */
    public void setQuestA(String questA)
    {
        this.questA = questA;
    }

    /**
     * 取得questB
     * @return 返回 questB。
    
     */
    public String getQuestB()
    {
        return questB;
    }

    /**
     * 设置questB
     * @param questB 要设置的 questB。
    
     */
    public void setQuestB(String questB)
    {
        this.questB = questB;
    }

    /**
     * 取得questC
     * @return 返回 questC。
    
     */
    public String getQuestC()
    {
        return questC;
    }

    /**
     * 设置questC
     * @param questC 要设置的 questC。
    
     */
    public void setQuestC(String questC)
    {
        this.questC = questC;
    }

    /**
     * 取得questD
     * @return 返回 questD。
    
     */
    public String getQuestD()
    {
        return questD;
    }

    /**
     * 设置questD
     * @param questD 要设置的 questD。
    
     */
    public void setQuestD(String questD)
    {
        this.questD = questD;
    }

    /**
     * 取得questresult
     * @return 返回 questresult。
    
     */
    public String getQuestresult()
    {
        return questresult;
    }

    /**
     * 设置questresult
     * @param questresult 要设置的 questresult。
    
     */
    public void setQuestresult(String questresult)
    {
        this.questresult = questresult;
    }

    /**
     * 取得q_type
     * @return 返回 q_type。
    
     */
    public int getQ_type()
    {
        return q_type;
    }

    /**
     * 设置q_type
     * @param qType 要设置的 q_type。
    
     */
    public void setQ_type(int qType)
    {
        q_type = qType;
    }

    /**
     * 取得q_id
     * @return 返回 q_id。
    
     */
    public int getQ_id()
    {
        return q_id;
    }

    /**
     * 设置q_id
     * @param qId 要设置的 q_id。
    
     */
    public void setQ_id(int qId)
    {
        q_id = qId;
    }

    /**
     * 取得q_key
     * @return 返回 q_key。
    
     */
    public String getQ_key()
    {
        return q_key;
    }

    /**
     * 设置q_key
     * @param qKey 要设置的 q_key。
    
     */
    public void setQ_key(String qKey)
    {
        q_key = qKey;
    }

    public int getPage()
    {
        return page;
    }

    public void setPage(int page)
    {
        this.page = page;
    }

    public int getPageCount()
    {
        return pageCount;
    }

    public void setPageCount(int pageCount)
    {
        this.pageCount = pageCount;
    }
}
